﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using AccesoDatos.Manejador;
using AccesoDatos.Objetos;
using Conexion;
using System.Windows.Forms;
/*
 * 
 *  
 */
namespace Autorizacion_facturas_caja
{
    public partial class frmFiniquitoCalcula : Form
    {
        objRH objR1 = new objRH();
        objRH objR2 = new objRH();
        objRH obj1 = new objRH();
        objFiniquito objF = new objFiniquito();
        objFiniquito objF1 = new objFiniquito();
        objVacaciones objV = new objVacaciones();
        Manejador_Empleado_Captura Man = new Manejador_Empleado_Captura();
        Manejador_Calcula_Fecha ManC = new Manejador_Calcula_Fecha();
        Manejador_Formulas ManFor = new Manejador_Formulas();
        Manejador_Finiquitos ManFin = new Manejador_Finiquitos();
        int dias_p;
        double salario, sueldo, monto_vacaciones;
        double valor = 0;
        double total=0, total_final;
        DateTime fecha_fin1;

        public frmFiniquitoCalcula(objRH obj)
        {
            InitializeComponent();
            obj1 = obj;
            lblRenuncia.Text = obj.Fecha_renuncia.ToShortDateString();
            objR1 = Man.ObtieneEmpleado(obj.Id_Empleado);
            objR2 = Man.ObtieneSueldoContrato(obj.Id_Empleado);
            
            mostrarDatos();
            cargaTablas();
            Calculos();
            MostrarImportes();
            dias();
           
        }
        public void cargaTablas() {
            //Vacaciones
            DataTable data = ManFin.ObtieneVacaciones_NoPagadas(obj1.Id_Empleado, salario);
            if (data.Rows.Count == 0)
            {
                dataGridView1.Visible = false;
                label21.Visible = false;
                label24.Visible = false;
                lblTotalVac.Visible = false;
            }
            else
            {
                dataGridView1.DataSource = ManFin.ObtieneVacaciones_NoPagadas(obj1.Id_Empleado, salario);
                formatoColumnas(1);
                monto_vacaciones = ManFin.ObtieneMonto_Vacaciones_No_Pagadas(obj1.Id_Empleado, salario);
                lblTotalVac.Text = String.Format("${0:###,##0.00}", monto_vacaciones);
            }
           //Prima Vacacional
            DataTable data2 = ManFin.ObtienePrimas_NoPagadas(obj1.Id_Empleado);
            if (data.Rows.Count == 0)
            {
                dataGridView2.Visible = false;
                label23.Visible = false;
                label25.Visible = false;
                lblMontoPrima.Visible = false;
                objF.MontoPrima = 0.00;
            }
            else
            {
                dataGridView2.DataSource = ManFin.ObtienePrimas_NoPagadas(obj1.Id_Empleado);
                formatoColumnas(2);
                objF.MontoPrima = ManFin.ObtieneMontoPrima(obj1.Id_Empleado);
                lblMontoPrima.Text = string.Format("${0:###,##0.00}", objF.MontoPrima);
            }
        }
        public void mostrarDatos() 
        {
            objR1.Nombre_completo = objR1.Nombre + " " + objR1.Apellidos;
            sueldo= Convert.ToDouble(objR2.Sueldo_Mensual);
            salario = Convert.ToDouble(objR2.Salario_dia);
            lblNombre.Text = objR1.Nombre_completo;
            lblDepartamento.Text = objR1.Departamento;
            lblIngreso.Text = objR1.FechaIngreso.ToShortDateString();
            lblPuesto.Text = objR1.Puesto;
            lblSucursal.Text = objR1.Nombre_Sucursal.ToUpper();
            lblDiario.Text = String.Format("${0:###,##0.00}", salario);
            lblSueldo.Text = String.Format("${0:###,##0.00}", sueldo);
            lblEmpresa.Text = objR1.Nombre_empresa;

            objR1.Salario_dia=objR2.Salario_dia;
            objR1.Fecha_renuncia = obj1.Fecha_renuncia;

        }
        public void formatoColumnas(int resp) 
        {
            switch(resp){
               case 1: //QUITA LA PRIMERA COLUMNA 
                    this.dataGridView1.RowHeadersVisible = false;
                    this.dataGridView1.Columns["Id_Vacaciones"].Visible = false;
                    this.dataGridView1.Columns["Id_Empleado"].Visible = false;
                    this.dataGridView1.Columns["Dias_Disfrutados"].Visible = false;
                    this.dataGridView1.Columns["Ciclo"].Visible=false;
                    this.dataGridView1.Columns["Prima_Vacacional"].Visible=false;
                    this.dataGridView1.Columns["Prima_Pagada"].Visible=false;
                    this.dataGridView1.Columns["Dias_Acomulados"].Visible=false;
                    this.dataGridView1.Columns["Monto_Dias_Pagados"].Visible=false;
                    this.dataGridView1.Columns["Dias_Pagados"].Visible=false;
                    this.dataGridView1.Columns["Dias_Correspondientes"].HeaderText = "Dias Ley";
                    this.dataGridView1.Columns["total"].DefaultCellStyle.Format = "c";
                    break;
                case 2:
                    this.dataGridView2.RowHeadersVisible = false;
                    this.dataGridView2.Columns["Prima_Vacacional"].HeaderText = "Prima Vacacional";
                    this.dataGridView2.Columns["Periodo"].HeaderText = "Periodo";
                    this.dataGridView2.Columns["Prima_Vacacional"].DefaultCellStyle.Format = "c";
                    break;
            }
        }
        public void MostrarImportes() {
          
           /*Muestra dias Pendientes*/ 
            lblDiasPendientes.Text = objF.Dias_Pendientes.ToString();
            lblTotalPendiente.Text = String.Format("{0:###,##0.00}", objF.TotalPendiente);
            diasProm.Text =objF.Dias_Pendientes.ToString();

           /*Muestra vacaciones*/
            lblDiasLeyVacaciones.Text = objF.Dias_LeyVacaciones.ToString(); ;
            lblDiasPromedioVacaciones.Text = String.Format("{0:###,##0.00}",objF.DiaspromedioVacaciones);
            lblTotalVacaciones.Text = String.Format("{0:###,##0.00}",objF.TotalVacaciones);
            lblDiasVacaciones.Text =objF.Dias_TVacaciones.ToString();

           /*Muestra Prima Vacacional*/
            lblTotalPrima.Text =String.Format("{0:###,##0.00}",objF.TotalPrimaVacacional);
    
           /*Muestra Aguinaldos*/
            lblDiasAguinaldo.Text = objF.Dias_TAguinaldos.ToString();
            lblDiasLeyAguinaldo.Text = "15";
            lblDiasPromedioAguinaldos.Text  =String.Format("{0:###,##0.00}",objF.DiasPromedioAguinaldo);
            lblTotalAguinaldos.Text =String.Format("{0:###,##0.00}",objF.TotalAguinaldo);
         
        }  
        public void Calculos() {

            calculodiasPendientes(); //Calcula los dias pendientes a pagar de la quincena
            calculaVacacionesProporcion(); // Calcula la proporcion de vacaciones que le tocan despues de cumplir un año o antes 
            calculaAguinaldo(); // calcula la proporcion de aguinaldo segun los dias trabajados
           
            
            total =objF.TotalAguinaldo+ objF.TotalPendiente +objF.TotalPrimaVacacional +objF.TotalVacaciones + monto_vacaciones+objF.MontoPrima;
           
            /*Obtiene dias_correspondientes, dias_disfrutados, prima_vacacional, prima_pagada*/
            objV = ManFin.ObtieneDiasCorrespondietes(obj1.Id_Empleado, objR1.FechaIngreso);

            DescontarPrestamo(); // Si tiene un prestamo se le descuenta
            DescontarPagoVacaciones(); // si se le pagaron dias de vacaciones
          
            total_final = total - valor - objF.AdeudoPrestamo;


            lblTotal.Text = String.Format("${0:###,##0.00}", total);
            lblTotalPagar.Text = String.Format("${0:###,##0.00}", total_final);
        }
        public void DescontarPagoVacaciones() {

            objF1 = ManFin.ObtieneDiasMontoVacaciones(obj1.Id_Empleado);
            if (objF1 != null)
            {
                dias_p = objF1.DiasPagados;
                if (dias_p != 0)
                {
                    lblDiasVa.Text = "Menos " + objF1.DiasPagados.ToString() + " de vac";
                    lblMonto.Text = String.Format("${0:###,##0.00}", objF1.MontoPagado);
                    valor = objF1.MontoPagado;   
                }
                else
                {
                    lblMonto.Visible = false;
                    lblDiasVa.Visible = false;
                    lblTotalVac.Visible = false;
                }
            }
            else
            {
                lblMonto.Visible = false;
                lblDiasVa.Visible = false;
                lblTotalVac.Visible = false;
            }
        
        }
 
        //Obtiene El monto del prestamo que aun no se paga
        public void DescontarPrestamo() {
            objF.AdeudoPrestamo = ManFin.ObtieneAdeudoPrestamo(obj1.Id_Empleado);
            if (objF.AdeudoPrestamo > 0)
            {
                lblPrestamo.Text = String.Format("${0:###,##0.00}", objF.AdeudoPrestamo);
            }
            else
            {
                lblPrestamo.Visible = false;
                lblPres.Visible = false;
                objF.AdeudoPrestamo = 0.00;
            }
        
        }
        
        public void calculaVacacionesProporcion() 
        {
            //Calcula el tiempo en años
            objF.Tiempo= ManC.calculaAntiguedad_Year(objR1.FechaIngreso, obj1.Fecha_renuncia);

            //Dias Trabajados Vacaciones
            objF.Dias_TVacaciones = ManC.calculaDiasVacaciones(objR1.FechaIngreso, obj1.Fecha_renuncia);
            //Dias por ley Vacaciones
            objF.Dias_LeyVacaciones= ManFin.ObtieneDiasporLey(objF.Tiempo + 1);
            //Dias Promedio
            objF.DiaspromedioVacaciones = ManFor.calculaDiasPromedio(objF.Dias_LeyVacaciones, objF.Dias_TVacaciones);
            //TOTAL VACACIONES
            objF.TotalVacaciones = ManFor.Total(objF.DiaspromedioVacaciones, salario);

            //PrimaVacacional
            objF.TotalPrimaVacacional = ManFor.PrimaVacacional(objF.DiaspromedioVacaciones, salario);          
        }
        
        public void calculodiasPendientes()
        {
            /*Dias Pendientes*/
            objF.Dias_Pendientes= ManC.calculaDiasPendientes(obj1.Fecha_renuncia);
            objF.TotalPendiente= ManFor.Total(Convert.ToDouble(objF.Dias_Pendientes), salario);

        }
       
        public void calculaAguinaldo() 
        {
            /*Para checar si la el año de la fecha inicio y la fecha fin es la misma para sacar el monto de los dias que corresponden
                y si es diferente el año sacar los dias que le corresponden desde el 31/12/XXXX*/
            bool bandera = obtenerYear();

            if (!bandera) fecha_fin1 = ManC.CalculaFechaAguinaldo(obj1.Fecha_renuncia);
            else fecha_fin1 = objR1.FechaIngreso;

            //Dias Trabajados Aguinaldos

            objF.Dias_TAguinaldos= ManC.calculaAntiguedad_Dias(fecha_fin1, obj1.Fecha_renuncia);

            //Calculo de los dias promedio del aguinaldo
            objF.DiasPromedioAguinaldo= ManFor.calculaDiasPromedio(15, objF.Dias_TAguinaldos);

            //Total de aguinaldo
            objF.TotalAguinaldo= ManFor.Total(objF.DiasPromedioAguinaldo, salario);
        }

        public void dias()
        {
            int dia_termino;
            int dias_mes, mes, year;
           
            mes = obj1.Fecha_renuncia.Month;
            year = obj1.Fecha_renuncia.Year;

            dia_termino= obj1.Fecha_renuncia.Day;
            if (dia_termino <= 15) { 
                objF.mensaje= "1 al " + dia_termino.ToString() + " de " + obj1.Fecha_renuncia.ToString("MMMM");
            }
            else {
                dias_mes = DateTime.DaysInMonth(year, mes);
                objF.mensaje = "16 al " + dia_termino.ToString() + " de " + obj1.Fecha_renuncia.ToString("MMMM");
            }
            
        }
        public bool obtenerYear() 
        {
            int year1, year2;

            year1 = objR1.FechaIngreso.Year;
            year2 = obj1.Fecha_renuncia.Year;

            if (year1 == year2) return true;
            
            return false;
        }
        private void btnInforme_Click_1(object sender, EventArgs e)
        {
           // DataTable empleado = Man.DatosEmpleado(obj1.Id_Empleado);
            //DataTable sueldo = Man.DatosSueldoContrato(obj1.Id_Empleado);
            DataTable data = ManFin.ObtieneVacaciones_NoPagadas(obj1.Id_Empleado,salario);
            frmFiniquito_Reporte rep = new frmFiniquito_Reporte(data, objR1, objF);
            rep.ShowDialog();

            
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            Close();
        }

    }
}
